package com.zjhn.ds.utils.base;

import com.zjhn.ds.common.exception.BizException;
import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @BelongsProject: equipment-and-energy
 * @BelongsPackage: com.zjhn.common.utils
 * @Author: sxt
 * @CreateTime: 2023-06-17  10:05
 * @Description: 日期工具类
 * @Version: 1.0
 */
public class DateUtil {

    /**
     * 默认日期格式 yyyy-MM-dd HH:mm:ss
     */
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 日期格式 yyyy-MM-dd
     */
    public static final String DATE_FORMAT = "yyyy-MM-dd";

    /**
     * 日期格式 yyyy-MM-dd
     */
    public static final String DATE_FORMAT_1 = "yy/MM/dd";

    /**
     * 日期格式化对象
     */
    private static SimpleDateFormat sdf = new SimpleDateFormat();

    /**
     * 将日期对象按照指定的格式转换成字符串
     *
     * @param date
     * @param format
     * @return
     */
    public static String formatDateToString(Date date, String format) {
        synchronized (sdf) {
            sdf = new SimpleDateFormat(format);
            return sdf.format(date);
        }
    }

    /**
     * 将字符串对象按照指定的格式转换成日期
     *
     * @param date
     * @param format
     * @return
     */
    public static Date formatDateToString(String date, String format) {
        try {
            if (StringUtils.isBlank(date))
                return null;
            synchronized (sdf) {
                sdf = new SimpleDateFormat(format);
                return sdf.parse(date);
            }
        } catch (ParseException e) {
            throw new BizException("时间转换异常");
        }
    }

    /**
     * 将日期对象按照默认的格式转换成字符串
     *
     * @param date
     * @return
     */
    public static String formatDateToString(Date date) {
        if (date == null)
            return null;
        return formatDateToString(date, DEFAULT_DATE_FORMAT);
    }

    /**
     * 将字符串对象按照默认的格式转换成日期类型
     *
     * @param date
     * @return
     */
    public static Date formatStringToDate(String date) {
        try {
            if (date != null) {
                synchronized (sdf) {
                    sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
                    return sdf.parse(date);
                }
            } else {
                return null;
            }
        } catch (ParseException e) {
            throw new BizException("时间转换异常");
        }
    }

    /**
     * 指定时间增加/减少分钟数
     *
     * @param beginDate
     * @param min
     * @return
     */
    public static Date dateAddMinute(Date beginDate, Integer min) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(beginDate);
        calendar.add(Calendar.MINUTE, min); //减10分钟
        return calendar.getTime();
    }

    /**
     * 计算相隔天数 向上取整
     * @param start
     * @param end
     * @return
     */
    public static Integer intervalDays(Date start, Date end) {
        Long starTime = start.getTime();
        Long endTime = end.getTime();
        long num = endTime - starTime;//时间戳相差的毫秒数
        return (int) Math.ceil(num * 1.0 / (24 * 60 * 60 * 1000));
    }

}
